#include "para.h"

Para::Para(Sentencia *next, Asignar *asignar, Expr *expr, Sentencia *instrucciones, int fila, int col):Sentencia(next,fila,col)
{
    this->asignar=asignar;
    this->expr = expr;
    this->instrucciones=instrucciones;
}

string Para::is()
{
    return "PARA";
}

void Para::setAsignar(Asignar *asignar)
{
    this->asignar = asignar;
}

void Para::setExpr(Expr *expr)
{
    this->expr=expr;
}

void Para::setInstrucciones(Sentencia *instrucciones)
{
    this->instrucciones = instrucciones;
}

Asignar *Para::getAsignar()
{
    return this->asignar;
}

Expr *Para::getExpr()
{
    return this->expr;
}

Sentencia *Para::getInstrucciones()
{
    return this->instrucciones;
}

Tipo_ts *Para::validarSemantica(Tabla_Simbolos *tabla_de_tipo, Tabla_Simbolos *tabla_de_varaible)
{
    Tipo_ts *asignar_ = this->asignar->validarSemantica(tabla_de_tipo,tabla_de_varaible);
    if(asignar_->is().compare("ENTERO")!=0){
        stringstream out;
        out<<"La Asignacion debe ser entera// Fila:"<<this->getFila()<<endl;
        throw exception(out.str().c_str());
    }
    Tipo_ts *expr_ = this->expr->validarSemantica(tabla_de_tipo,tabla_de_varaible);
    if(expr_->is().compare("ENTERO")!=0){
        stringstream out;
        out<<"El Final del Para debe ser entera// Fila:"<<this->getFila()<<endl;
        throw exception(out.str().c_str());
    }
    if(this->instrucciones!=0){
        this->instrucciones->validarSemantica(tabla_de_tipo,tabla_de_varaible);
    }
    if(this->getNext()!=0){
        this->getNext()->SetReturn(this->GetReturn());
        this->getNext()->validarSemantica(tabla_de_tipo,tabla_de_varaible);
    }
    return 0;
}

string Para::generarCodigo(GenerarVariable *var, Tabla_Simbolos *tabla_de_tipo, Tabla_Simbolos *tabla_de_varaible)
{
string codigo;
codigo += this->asignar->generarCodigo(var,tabla_de_tipo,tabla_de_varaible);
string var_ = this->asignar->getVariable()->generarCodigo(var,tabla_de_tipo,tabla_de_varaible).codigo;
codigo += "for("+var_;
codigo += ";"+var_+"<="+this->getExpr()->generarCodigo(var,tabla_de_tipo,tabla_de_varaible).codigo+";";
codigo += var_+"++) {\n";
if(this->getInstrucciones()!=0){
codigo += this->getInstrucciones()->generarCodigo(var,tabla_de_tipo,tabla_de_varaible);
}
codigo += "}\n";
if(this->getNext()!=0){
    codigo += this->getNext()->generarCodigo(var,tabla_de_tipo,tabla_de_varaible);
}

return codigo;
}
